package com.wang.spring.lifecycle.c_initializingbean;

import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;


/**
 * bean 的声明周期的三个 分类 （自己定义的）
 * 1、spring 的 init destroy 方法
 * 2、java 的注解的方式
 * 3、实现 InitializingBean DisposableBean 接口的方式
 */
public class Pen3 implements InitializingBean, DisposableBean {

    private Integer ink;


    /**
     * 这个是spring 调用的init 和destroy 方法
     */
    public void open() {
        System.out.println("init-method 打开钢笔");
    }

    public void close() {
        System.out.println("destroy-method 合上钢笔");
    }


    /**
     *  这两个方法是 java的标准 @PostConstruct  @PreDestroy
     */
    @PostConstruct
    public void addInks() {
        this.ink = 10;
        System.out.println("@PostConstruct  开始执行 加墨水");
    }


    @PreDestroy
    public void outInks() {
        this.ink = 0;
        System.out.println("@PreDestroy  销毁 导出墨水");
    }


    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("Pen3 钢笔中已经加满墨水  InitializingBean.afterPropertiesSet");
        this.ink = 100;

    }

    @Override
    public void destroy() throws Exception {
        System.out.println("Pen3 钢笔中墨水都放干净了  DisposableBean.destroy");
        this.ink = 0;
    }

    @Override
    public String toString() {
        return "Pen{" +
                "ink=" + ink +
                '}';
    }
}
